﻿using Infrastructure.Model.ApiResult;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;
using Microsoft.AspNetCore.Mvc.ModelBinding;

namespace Infrastructure.Attribute
{
    /// <summary>
    /// 全局操作特性，用于在控制器的Action方法执行之前和之后进行处理。
    /// 实现了IActionFilter接口和IFilterMetadata接口，提供自定义的操作过滤功能。
    /// </summary>
    public class GlobalActionAttribute : System.Attribute, IActionFilter, IFilterMetadata
    {
        /// <summary>
        /// 在Action执行之前调用，用于处理请求前的操作。
        /// 如果ModelState无效（即数据模型验证失败），则构建ApiResult并返回详细的错误信息。
        /// </summary>
        /// <param name="context">Action执行上下文</param>
        public void OnActionExecuting(ActionExecutingContext context)
        {
            // 如果ModelState有效，直接返回
            if (context.ModelState.IsValid)
            {
                return;
            }

            // 创建一个ApiResult对象，Code为101表示请求失败
            ApiResult apiResult = new ApiResult
            {
                Code = 101
            };

            // 遍历ModelState中的所有错误信息
            foreach (ModelStateEntry value in context.ModelState.Values)
            {
                foreach (ModelError error in value.Errors)
                {
                    // 如果错误消息包含"JSON"，不进行任何处理
                    if (error.ErrorMessage.Contains("JSON"))
                    {
                        return;
                    }

                    // 拼接所有错误消息，使用" | "作为分隔符
                    if (!string.IsNullOrEmpty(apiResult.Msg))
                    {
                        apiResult.Msg += " | ";
                    }
                    apiResult.Msg += error.ErrorMessage;
                }
            }

            // 将ApiResult作为返回结果
            context.Result = new JsonResult(apiResult);
        }

        /// <summary>
        /// 在Action执行之后调用，但此方法为空，未做任何处理。
        /// </summary>
        /// <param name="context">Action执行后的上下文</param>
        public void OnActionExecuted(ActionExecutedContext context)
        {
            // 当前不做任何处理
        }
    }
}